﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;


namespace Projeto
{
    public class Carta
    {
        Random random = new Random();

        /// <summary>
        /// Imagem da carta
        /// </summary>
        Texture2D Imagem;
        public Texture2D imagem
        {
            get { return Imagem; }
            set
            {
                Imagem = value;
            }
        }

        /// <summary>
        /// Posição que a carta deverá aparecer
        /// </summary>
        Rectangle Destino;
        public Rectangle destino
        {
            get { return Destino; }
            set
            {
                Destino = value;
            }
        }

        /// <summary>
        /// Pontuação da carta
        /// </summary>
        int Pontos;
        public int pontos
        {
            get { return Pontos; }
            set
            {
                Pontos = value;
            }

        }

        /// <summary>
        /// Determina se a carta será visivel (com a imagem apresentada) ou não visivel (com a tela de fundo da carta)
        /// </summary>
        bool Visivel;
        public bool visivel
        {
            get { return Visivel; }
            set
            {
                Visivel = value;
            }
        }

        bool Clicado;
        public bool clidado
        {
            get { return Clicado; }
            set
            {
                Clicado = value;
            }
        }

        Vector2 Tamanho;
        public Vector2 tamanho
        {
            get { return Tamanho; }
            set
            {
                Tamanho = value;
            }
        }


        Vector2 Posicao;
        public Vector2 posicao
        {
            get { return Posicao; }
            set
            {
                Posicao = value;
            }
        }

        Rectangle Origem;
        public Rectangle origem
        {
            get { return Origem; }
            set
            {
                Origem = value;
            }
        }

        int ProximoAparecer;
        public int proximoAparecer
        {
            get { return ProximoAparecer; }
            set
            {
                ProximoAparecer = value;
            }
        }

        int TempoParaAparecer;
        public int tempoParaAparecer
        {
            get { return TempoParaAparecer; }
            set
            {
                TempoParaAparecer = value;
            }
        }

        GameWindow JanelaJogo;
        public GameWindow janelaJogo
        {
            get { return JanelaJogo; }
            set
            {
                JanelaJogo = value;
            }
        }

        int QtdCoincidencias;
        public int qtdCoincidencias
        {
            get { return QtdCoincidencias; }
            set
            {
                QtdCoincidencias = value;
            }
        }

        int QtdAgora;
        public int qtdAgora
        {
            get { return QtdAgora; }
            set
            {
                QtdAgora = value;
            }
        }

        int QtdMaxima;
        public int qtdMaxima
        {
            get { return QtdMaxima; }
            set
            {
                QtdMaxima = value;
            }
        }

        SpriteFont Fonte;
        public SpriteFont fonte{

            get { return Fonte; }
            set
            {
                Fonte = value;
            }

        }

        String[] Caracteristica;
        public String[] caracteristica
        {
            get { return Caracteristica; }
            //TODO cuidado para não receber um vetor completo,
            //TODO procurar adicionar uma posição por vez
            set
            {
                Caracteristica = value;
            }
        }

        /// <summary>
        /// Desenha a imagem da carta, caso se esteja visivel
        /// </summary>
        /// <param name="spriteBatch">SpriteBatch usado para desenhar a carta</param>
        public void Draw(SpriteBatch spriteBatch)
        {
            //spriteBatch.Draw(Imagem, Destino, Color.White);

            if (Visivel)
            {
                spriteBatch.Draw(imagem, destino, origem, Color.White);
                //spriteBatch.DrawString(Fonte,"Próximo aparecer: " + proximoAparecer + "\nTempo para aparecer: " + tempoParaAparecer + "\nQuantas apareceu: " //+ qtd_apareceu
                 //   ,new Vector2(destino.X, destino.Y), Color.Black);
            }

        }



        /// <summary>
        ///    Regra do Jogo
        ///    
        /// </summary>
        /// <param name="gameTime"></param>
        /// <param name="gw"></param>
        /// <param name="mouse_atual"></param>
        /// <param name="mouse_anterior"></param>
        /// <param name="Pontos"></param>

        public void JogoReflexo(GameTime gameTime, GameWindow gw,
           MouseState mouse_atual,
           MouseState mouse_anterior,
            int tempoAtual,
            Baralho baralhoJogo,
           ref int pontos)
        {
                
                #region se clicou se acertou se visivel

                if ((mouse_atual.LeftButton == ButtonState.Pressed) &&
                    !(mouse_anterior.LeftButton == ButtonState.Pressed)) // clicou ?
                {
                    if (destino.Contains(mouse_atual.X, mouse_atual.Y)) // clicou dentro do retangulo de colisão ?
                    {
                        if (visivel) // tá aparecendo(ativo) ?
                        {
                            pontos += this.pontos;
                            visivel = false;
                            clidado = true;
                            //Alvo.qtd_now--;
                            proximoAparecer = tempoAtual + tempoParaAparecer;
                        }
                    }
                }
                #endregion

                #region se visivel se nao clicou

                tempoAtual++;//cuidado para chamar apenas uma vez em todo update

                if (visivel)
                {
                    if (tempoAtual >= proximoAparecer)
                    {
                        visivel = false;
                        //Alvo.qtd_now--;
                        proximoAparecer = tempoAtual + tempoParaAparecer;//resortear o tempo para aparecer?
                    }
                }
                #endregion

                #region se nao visivel se passou hora de aparecer
                if (!visivel)
                {
                    if (tempoAtual >= proximoAparecer)
                    {
                        proximoAparecer = tempoAtual + tempoParaAparecer;
                        if (qtdAgora < qtdMaxima)
                        {
                            int posicaoX = random.Next((int)(gw.ClientBounds.Height - tamanho.X));
                            int posicaoY = random.Next((int)(gw.ClientBounds.Width - tamanho.Y));

                            if (posicaoX + tamanho.X >= gw.ClientBounds.Height)
                            {
                                posicaoX -= (int) tamanho.X;
                            }
                            
                            if (posicaoY + tamanho.Y >= gw.ClientBounds.Width)
                            {
                                posicaoY -= (int)tamanho.Y;

                            }


                            if (posicaoX + tamanho.X < gw.ClientBounds.Height)
                            {
                                posicaoX += (int)tamanho.X;
                            }

                            if (posicaoY + tamanho.Y < gw.ClientBounds.Width)
                            {
                                posicaoY += (int)tamanho.Y;

                            }

                            destino = new Rectangle(
                                posicaoX,
                                posicaoY,
                                (int)tamanho.X,
                                (int)tamanho.Y);

                            bool coincide = false;

                            /*
                            foreach (Carta temp in baralhoJogo.cartas)
                            {
                                if (temp.visivel)
                                {
                                    if (temp.destino.Intersects(destino))//destino/posicao desta this carta, q está invisível
                                    {
                                        coincide = true;
                                    }
                                }
                            }
                             */

                            //carta.visivel = true;
                            if (coincide)
                            {
                                qtdCoincidencias++;
                                //visivel = true;//comente q eles nao coincidem mais
                            }
                            else
                            {
                                visivel = true;
                                //Alvo.qtd_coincidencias++;
                            }
                        }
                    }
                }
                #endregion

            
        }

    }
}
